#pragma once
#include <string>
#include <queue>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
#include "../database_system.h"
#include "../conf/config.h"
#ifdef _WIN32
const std::string OS_NAME = "Windows";
const int OS_TYPE = 1; // 自定义类型标识，1表示Windows
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib") // 链接Winsock库
#elif defined(__linux__)
const std::string OS_NAME = "Linux";
const int OS_TYPE = 2; // 2表示Linux
#include <sys/socket.h> // 用于socket编程
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#else
const std::string OS_NAME = "Unknown";
const int OS_TYPE = 0; // 0表示未知系统
#endif


// 全局变量声明 - 控制服务器运行状态
extern bool is_running;

// 连接池类声明
class ConnectionPool
{
private:
// 存储客户端连接的队列
#ifdef _WIN32
    std::queue<SOCKET> connections;
#elif defined(__linux__)
    std::queue<int> connections;
#endif
    // 互斥锁 - 用于保护共享资源的访问
    std::mutex mtx;

    // 条件变量 - 用于线程间通信
    std::condition_variable cv;

    // 最大连接数限制
    int max_connections;

    // 工作线程容器
    std::vector<std::thread> worker_threads;
    // 数据库系统对象
    DatabaseSystem db;
    // 配置对象
    Config &config;
    // 处理单个客户端连接的函数
#ifdef _WIN32
    void handle_connection(SOCKET client_socket);
#elif defined(__linux__)
    void handle_connection(int client_socket);
#endif

    // 工作线程的主函数
    void worker();

public:
    // 构造函数 - 初始化连接池，参数为最大连接数
    ConnectionPool();
    // 析构函数 - 清理资源，确保线程正确退出
    ~ConnectionPool();

// 添加新连接到连接池
// 返回值：true表示添加成功，false表示连接池已满
#ifdef _WIN32
    bool add_connection(SOCKET client_socket);
#elif defined(__linux__)
    bool add_connection(int client_socket);
#endif
};
